perm filename RNDPDL.FIX[NEW,LSP] blob sn#476824 filedate 1979-09-26 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Here are the changes to MacLisp to make the pdlov thing go away
C00015 ENDMK
C⊗;
Here are the changes to MacLisp to make the pdlov thing go away
IN DEFNS >:

;macros here

DEFINE %			;THIS IS GOOD FOR LIST STRUCTURE
,,.+1!TERMIN


DEFINE INFORM R,S,T,U,V,W,X,Y,Z,$,%
PRINTX ≤	R!S!T!U!V!W!X!Y!Z!$!%
≤
TERMIN

DEFINE WARN R,S,T,U,V,W,X,Y,Z,$,%
WARN1 [R!S!T!U!V!W!X!Y!Z!$!%]
TERMIN

DEFINE WARN1 CRUFT
IFL 40-.LENGTH ≤CRUFT≤,[ .ERR ######
PRINTX ≤	###### CRUFT
≤
]
.ELSE .ERR ###### CRUFT
TERMIN

;;; USEFUL MACRO FOR .FASL FILES.  CAUSES LOADING TO PRINT MESSAGE.

DEFINE VERPRT NAME
.SXEVAL    (COND ((STATUS NOFEATURE NOLDMSG)
		  (TERPRI MSGFILES)
		  (TYO #73  MSGFILES)
		  (PRINC (QUOTE L/o/a/d/i/n/g/ NAME/ ) MSGFILES)
		  (DO ((N #<.FNAM2> (LSH N #6 )))
		      ((ZEROP N))
		      (TYO (PLUS #40  (LSH N #-30. ))
			   MSGFILES))))

TERMIN

;MACRO TO HANDLE UNWIND-PROTECT
;	UNWINDPROTECT CODE,CONTINUATION-CODE
;CAUSES CONTINUATION TO BE INVOKED AFTER CODE IS EXECUTED
;THE STATE OF THE PDLS MUST BE THE SAME BEFORE AND AFTER CODE EXECUTES.
;  CODE SHOULD BE THOUGHT OF AS A FUNCTION CALL.
; CODE IS THE CODE TO BE INVOKED AND PROTECTED.
; CONT IS THE "CONTINUATION" TO BE RUN WHEN UNWINDING THE STACK, OR AFTER
;    CODE IS RUN
DEFINE UNWINDPROTECT CODE,CONT,\LABEL
	JSP TT,PTNTRY		   ;SETUP AN UNWIND PROTECT
	JRST LABEL
	CONT
	POPJ P,
LABEL:
	CODE
;ASSUMPTION IS THAT FOLLOWING JSP CLOBBERS THE WORLD
	JSP TT,PTEXIT		   ;RUN CONTINUATION, PRESERVES A
TERMIN

IFN SAIL,[
DEFINE FIXPDLP FREEAC
	HRRZ FREEAC,P
	MOVE P,C2
	SUBI FREEAC,(P)
	HRLS FREEAC
	ADD P,FREEAC
TERMIN

DEFINE FIXPDLFXP FREEAC
	HRRZ FREEAC,FXP
	MOVE FXP,FXC2
	SUBI FREEAC,(FXP)
	HRLS FREEAC
	ADD FXP,FREEAC
TERMIN

DEFINE FIXPDLFLP FREEAC
	HRRZ FREEAC,FLP
	MOVE FLP,FLC2
	SUBI FREEAC,(FLP)
	HRLS FREEAC
	ADD FLP,FREEAC
TERMIN

DEFINE FIXPDLSP FREEAC
	HRRZ FREEAC,SP
	MOVE SP,SC2
	SUBI FREEAC,(SP)
	HRLS FREEAC
	ADD SP,FREEAC
TERMIN

]	;END OF IFN SAIL

IN *LISP >:

;here
UIBRK:	EXCH D,TT		;UNWIND-PROTECT NEEDS STACK POINTER IN AC TT
	PUSHJ FXP,UNWPRO	;HANDLE UNWIND PROTECTION
	EXCH D,TT
	HRRM TT,-1(D)

IFN SAIL,[
   	HRRZ FXP,1(D)
	FIXPDLFXP AR1
]	;END OF IFN SAIL

SA%	HRRO FXP,1(D)		;JUST SET LEFT HALF OF PDL POINTERS

IFN SAIL,[
   	HLRZ FLP,1(D)
	FIXPDLFLP AR1
]	;END OF IFN SAIL

SA%	HLRO FLP,1(D)		; TO -1 FOR BIBOP, AND LET PDLOV

IFN SAIL,[
   	HRRZI P,-UIFRM(D)
	FIXPDLP AR1

]	;END OF IFN SAIL

SA%	HRROI P,-UIFRM(D)
	MOVEM F,UISAVT-T+F(FXP)	;LET F BE SAFE OVER RESTORATION
	MOVEM T,UISAVT(FXP)	;T TOO
	MOVEM C,UISAVA-A+C(P)	;C TOO
	MOVEM B,UISAVA-A+B(P)	;B TOO
	MOVEM A,UISAVA(P)	;A TOO
	JRST UINT0X

;THIS ROUTINE FINDS ALL UNWIND-PROTECTS BETWEEN THE CURRENT STACK POSITION
; AND THE DESIRED STACK POSITION (AS FOUND IN TT).  IF AN UNWIND-PROTECT IS
; FOUND, THEN:
;   A) THE UNWIND-PROTECT STACK FRAME IS POP'ED *WITHOUT UPDATING FXP OR FLP*
;   B) SP IS UNWOUND TO THE CURRENT BINDING LEVEL
;   C) THE FUNCTION IS CALLED WITH EVERYTHING SAVED
;   D) WHEN THE FUNCTION RETURNS, ACS ARE RESTORED AND THE ROUTINE CONTINUES
;      SEARCHING FOR THE NEXT UNWIND PROTECT
; WHEN NO MORE UNWIND PROTECTS EXIST IN THE SPECIFIED RANGE OF THE PDL,
; THIS ROUTINE RETURNS TO ITS CALLER, WHICH IS EXPECTED TO RESTORE
; FXP AND FLP (AND POSSIBLY OTHERS) FROM THE STACK FRAME THAT WAS USED TO STOP
; THE UNWIND-PROTECT SEARCH
; CALLED WITH PUSHJ FXP,
; TT CONTAINS LOWEST ADR TO SEARCH
; PRESERVES ALL AC'S
UNWPRO:
;;; AMOUNT OF STUFF THAT GETS PUSHED MUST BE WELL DEFINED, CHANGE UNWPUS
;;; IF IT CHANGES
.SEE UNWPUS
	PUSH FXP,D
	PUSH FXP,T
	PUSH FXP,R
	PUSH FXP,TT
;;;
	HRRZS TT		;ONLY PDL PART
	MOVEI R,(SP)		;CURRENT VALUE OF SP IN CASE NO FRAMES FOUND
UNWPR2:	SKIPE D,CATRTN
UNWPR1:	 CAILE TT,(D)		;HAVE WE GONE TOO FAR?
	  JRST UNWPRT		;NO MORE FRAMES POSSIBLE, SO RETURN
	HRLZI T,CATUWP		;IS THIS AN UNWIND-PROTECT FRAME?
	TDNN T,(D)
	 JRST UNWNXT		;NOT UNWIND-PROTECT, SO SKIP THIS FRAME

IFN SAIL,[
 	HRRZ P,D
	FIXPDLP T
]	;END OF IFN SAIL

SA%	HRRO P,D		;RESET PDL, WILL WORK BY PDL OV NEXT PUSH
;;; PUSH NOTE
.SEE UNWPUS
	PUSH FXP,UNREAL		;FROM THIS POINT ON ALLOW NO USER INT'S
;;;
	SETOM UNREAL
	LOCKI
	MOVE T,(P)		;GET POINTER TO UNWIND HANDLER
	MOVSI D,-LEP1+1(P)	;RESTORE HAS FRAME (SNARFED FROM ERR1)
	HRRI D,ERRTN
	BLT D,ERRTN+LEP1-1
	SUB P,EPC1
	POP P,D			;GET OLD FXP
	POP P,FLP		;RESTORE FLP
	POP P,R			;SAVE LEVEL TO SP UNWIND TO
	POP P,PA3
	PUSHJ FXP,SAV5		;SAVE ALL PROTECTED ACS
	MOVEI B,(T)		;POINTER TO COMPILED FUNCTION OR LIST
UNLOCKI
;;; PUSH NOTE
.SEE UNWPUS
	PUSHJ P,SAVX5		;AND UNPROTECTED ONES
;;;
	HRRI T,(D)
	MOVEI TT,(R)
	PUSHJ P,UBD0		;UNWIND SP
	MOVEI TT,(T)
	TLNN T,CATCOM		;COMPILED CODE?
	 JRST UNWNCM		;NOPE, USE PROGN
UNWPUS==:13			;NUMBER OF PUSHES DONE ON FXP
	HRLI TT,-<UNWPUS-1>(FXP);BLT POINTER TO DATA THAT MUST BE MOVED
	AOS TT
	MOVEI D,UNWPUS-1(TT)	;BLT END POINTER
	BLT TT,(D)		;BLT ALL IMPORTANT FXP DATA

IFN SAIL,[
 	PUSH P,TT
 	HRRZI TT,FXP
	FIXPDLFXP TT
 	POP P,TT
]	;END OF IFN SAIL

SA%	HRROI FXP,(D)		;NEW FXP
	PUSHJ P,(B)		;INVOKE THE UNWINDPROTECTION CODE
	SKIPA
UNWNCM:	 PUSHJ P,IPROGN
	MOVE A,-5(FXP)		;GET OLD VALUE OF UNREAL, ALSO SETS UP THIS VALUE
	SKIPL A			;NO NEED TO CALL IF ALL INTERRUPTS BEING DEFFERED ANYWAY
	 PUSHJ P,CHECKU		;AND SEE IF INTERRUPTS TO BE RUN
	PUSHJ P,RSTX5		;RESTORE ACS
	PUSHJ FXP,RST5
	POP FXP,UNREAL		;WE'VE MADE SURE INTERRUPTS GET RUN, BUT MAY BE DEFFERING HERE
	JRST UNWPR2		
UNWNXT:	MOVE D,<-LEP1+1>+<CATRTN-ERRTN>(D) ;GO BACK ONE CATCH
	JUMPN D,UNWPR1		;IF MORE FRAMES TO CHECK THEN GO ON
UNWPRT:	POP FXP,TT
	POP FXP,R
	POP FXP,T
	POP FXP,D
	POPJ FXP,

IN *LISP >:

;here
FRETURN:  TDZA C,C		;LH OF C REMEMBERS WHICH ENTRY
FRETRY:	 MOVSI C,TRUTH
	HRR C,B
	JSP R,GTPDLP
	 0
	 JFCL
	MOVEI F,(D)
	MOVE TT,[$EVALFRAME]
	CAMN TT,1(F)
	 JRST FRETR1
	MOVE TT,[$APPLYFRAME]
	CAME TT,1(F)
	 JRST FRERR
FRETR1:	MOVEI D,(F)
	SUBI D,(P)
	HRLI D,(D)
	HRRI D,(F)
	MOVE TT,[$UIFRAME]
	CAME TT,(D)	;SEARCH FOR A USER INTERRUPT FRAME
	 AOBJN D,.-1
	CAMN TT,(D)
	 JSP TT,UIBRK
FRP1:	SKIPE T,PA4	;BREAK UP A DOMINEERING PROG
	 CAIL F,(T)		;[WHICH BREAKS UP INTERIOR ERRSETS AND CATCHES]
	  JRST FRP2
	MOVEI TT,FRP1-1		;FAKE OUT RETURN BY INSERTING A RETURN-ADDRESS
	MOVEM TT,-LPRP+1(T)	;OF FRP1 ON THE PDL
	JRST RETURN

FRP2:	SKIPE B,ERRTN		;BREAK UP A DOMINEERING ERRSET
FRP2A:   CAIL F,(B)
	  JRST FRP4
	MOVEI T,FRP1
	MOVEI TT,FRP1
	JRST BKRST0

FRP4:	SKIPE B,CATRTN		;BREAK UP A CATCH
	 CAIL F,(B)
	  JRST FRP3
	MOVEI T,FRP1		;IN CASE OF UNWIND-PROTECT
	MOVEI TT,FRP1
	JRST BKRST0

FRP3:	SKIPN B,EOFRTN	;BREAK OUT OF ANY E-O-F SET READS
	 JRST FRP3QA
	CAIGE F,(B)
	 JRST FRP2A
FRP3QA:	MOVEI A,(C)
IFE PAGING,[
	ADDI F,1		;FIX UP PDL POINTERS
	SUB F,C2
	HRLS F
	ADD F,C2
	MOVE P,F
	HRRZ F,-2(P)
	SUB F,FXC2
	HRLS F
	ADD F,FXC2
	MOVE FXP,F
	HLRZ F,-2(P)
	SUB F,FLC2
	HRLS F
	ADD F,FLC2
	MOVE FLP,F
]		;END OF IFE PAGING
IFN PAGING,[			;IN A PAGED SYSTEM, THE PDLOV HANDLER

IFN SAIL,[
	HRRZI P,1(F)
	FIXPDLP TT
	HLRZ FLP,-2(P)
	FIXPDLFLP TT
	HRRZ FXP,-2(P)
	FIXPDLFXP TT
]	;END OF IFN SAIL

SA%	HRROI P,1(F)		; WILL FIX UP THE LHS OF THE PDL PTRS
SA%	HLRO FLP,-2(P)
SA%	HRRO FXP,-2(P)
]		;END OF IFN PAGING
	HLRZ TT,-1(P)
	TLNN C,-1		;FOR "FRETURN" JUST UNBIND TO MARKED
	 JRST UBD		;  POINT, AND POP FRAME
	PUSHJ P,UBD
	HLRZ TT,(A)		;BUT DO MORE FOR "FRETRY", AFTER UBD
	JSP T,%CADDR
	POPI P,L$EVALFRAME	;GET RID OF BASIC EVALFRAME
	CAIE TT,QAPPLY
	  JRST EVAL
	HRRZ B,(A)
	HLRZ B,(B)
	HLRZ A,(A)
	HLRE T,(P)		;GET RID OF ARGS ON APPLYFRAME 
	SKIPG T			;FIGURE OUT LENGTH OF ARGS PART
	MOVEI T,1
	HRLI T,(T)
	SUB P,T
	JRST .APPLY